/**
 ******************************************************************************
 * @file           : bsp_gpio.h
 * @brief          : GPIO Driver Header File (STM32H7xx)
 ******************************************************************************
 * @attention
 *
 * GPIO驱动程序头文件
 * 提供简化的GPIO操作接口
 * 支持GPIOA~GPIOK
 *
 ******************************************************************************
 */

/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __BSP_GPIO_H
#define __BSP_GPIO_H

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include <stdint.h>

/* Exported types ------------------------------------------------------------*/
/**
 * @brief GPIO错误码枚举
 */
typedef enum
{
    GPIO_OK = 0,                /*!< 成功 */
    GPIO_ERROR_PARAM,           /*!< 参数错误 */
    GPIO_ERROR_INVALID_PORT,    /*!< 无效的GPIO端口 */
    GPIO_ERROR_INVALID_PIN      /*!< 无效的GPIO引脚 */
} GPIO_Error_e;

/**
 * @brief GPIO引脚电平枚举
 */
typedef enum
{
    GPIO_PIN_LOW = 0,           /*!< 低电平 */
    GPIO_PIN_HIGH               /*!< 高电平 */
} GPIO_PinLevel_e;

/**
 * @brief GPIO模式枚举
 */
typedef enum
{
    GPIO_MODE_INPUT = 0,        /*!< 输入模式 */
    GPIO_MODE_OUTPUT_PP,        /*!< 推挨输出 */
    GPIO_MODE_OUTPUT_OD,        /*!< 开漏输出 */
    GPIO_MODE_AF_PP,            /*!< 复用推挨 */
    GPIO_MODE_AF_OD,            /*!< 复用开漏 */
    GPIO_MODE_ANALOG            /*!< 模拟模式 */
} GPIO_Mode_e;

/**
 * @brief GPIO上下拉枚举
 */
typedef enum
{
    GPIO_NOPULL = 0,            /*!< 无上下拉 */
    GPIO_PULLUP,                /*!< 上拉 */
    GPIO_PULLDOWN               /*!< 下拉 */
} GPIO_Pull_e;

/**
 * @brief GPIO速度枚举
 */
typedef enum
{
    GPIO_SPEED_LOW = 0,         /*!< 低速(2MHz) */
    GPIO_SPEED_MEDIUM,          /*!< 中速(10MHz) */
    GPIO_SPEED_HIGH             /*!< 高速(50MHz) */
} GPIO_Speed_e;

/* Exported constants --------------------------------------------------------*/
/* Exported macro ------------------------------------------------------------*/

/**
 * @brief GPIO引脚位定义
 */
#define GPIO_PIN_0       (0x0001U)  /*!< Pin 0 */
#define GPIO_PIN_1       (0x0002U)  /*!< Pin 1 */
#define GPIO_PIN_2       (0x0004U)  /*!< Pin 2 */
#define GPIO_PIN_3       (0x0008U)  /*!< Pin 3 */
#define GPIO_PIN_4       (0x0010U)  /*!< Pin 4 */
#define GPIO_PIN_5       (0x0020U)  /*!< Pin 5 */
#define GPIO_PIN_6       (0x0040U)  /*!< Pin 6 */
#define GPIO_PIN_7       (0x0080U)  /*!< Pin 7 */
#define GPIO_PIN_8       (0x0100U)  /*!< Pin 8 */
#define GPIO_PIN_9       (0x0200U)  /*!< Pin 9 */
#define GPIO_PIN_10      (0x0400U)  /*!< Pin 10 */
#define GPIO_PIN_11      (0x0800U)  /*!< Pin 11 */
#define GPIO_PIN_12      (0x1000U)  /*!< Pin 12 */
#define GPIO_PIN_13      (0x2000U)  /*!< Pin 13 */
#define GPIO_PIN_14      (0x4000U)  /*!< Pin 14 */
#define GPIO_PIN_15      (0x8000U)  /*!< Pin 15 */
#define GPIO_PIN_ALL     (0xFFFFU)  /*!< All pins */

/* Exported variables --------------------------------------------------------*/
/* Exported functions --------------------------------------------------------*/

/* GPIO初始化函数 */
GPIO_Error_e gpio_init_pin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_Mode_e mode, GPIO_Pull_e pull, GPIO_Speed_e speed);

/* GPIO读写函数 */
GPIO_Error_e gpio_write_pin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinLevel_e level);
GPIO_Error_e gpio_read_pin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin, GPIO_PinLevel_e *level);
GPIO_Error_e gpio_toggle_pin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

/* GPIO端口操作 */
GPIO_Error_e gpio_write_port(GPIO_TypeDef *GPIOx, uint16_t value);
GPIO_Error_e gpio_read_port(GPIO_TypeDef *GPIOx, uint16_t *value);

/* GPIO锁定功能 */
GPIO_Error_e gpio_lock_pin(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

/* 调试接口 */
void gpio_print_status(GPIO_TypeDef *GPIOx, uint16_t GPIO_Pin);

#ifdef __cplusplus
}
#endif

#endif /* __BSP_GPIO_H */
